package jp.co.systemi.asp.workflow.user;

/**
 * 新規ユーザの自己登録
 * 新規ユーザ自己登録からアクティベーションまでのフロー
 * １．新規ユーザの自己登録
 * ２．ユーザ情報の保存（未アクティブ状態）
 * ３．アクティベーションメール送信
 * ４．アクティベーションメールのURLをアクセス
 * ５．アクティブ状態に更新する
 */

/* 新規Validatorを追加するには
 * １．Annoationを作成する
 * 例：jp.co.systemi.asp.workflow.annotation.LengthBetween
 * ２．Validatorを作成する
 * 例；jp.co.systemi.asp.workflow.validator.LenBetweenValidator
 * ３．プロパティファイルにメッセージを追加する
 * 例：Superpropertiesに(共通メッセージであるため、親クラスのプロパティに定義しておく)
 * LenBetweenValidator=【${label}】には${minimum}桁以上、${maximum}桁以内に入力してください。
 * を追加
 * @author wzhang
 *
 */

import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;

import jp.co.systemi.asp.workflow.Main;
import jp.co.systemi.asp.workflow.data.Group;
import jp.co.systemi.asp.workflow.data.GroupMeta;
import jp.co.systemi.asp.workflow.data.User;
import jp.co.systemi.asp.workflow.data.UserGroup;
import jp.co.systemi.asp.workflow.data.UserGroupMeta;
import jp.co.systemi.asp.workflow.data.UserMeta;
import jp.co.systemi.asp.workflow.group.GroupRef;

import org.apache.wicket.PageParameters;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.model.PropertyModel;
import org.slim3.datastore.Datastore;

import com.google.appengine.api.datastore.Transaction;
import com.google.appengine.api.users.UserService;
import com.google.appengine.api.users.UserServiceFactory;

public class UserRef extends Main {
    private static final Logger log = Logger.getLogger(UserRef.class.getName());
    private User model = null;

    // 所属グループ
    private List<UserGroup> belongGroups = new ArrayList<UserGroup>();
    private Form<User> form = null;
    private ListView<UserGroup> lvBelongGroup = null;

    public UserRef(PageParameters pars) {
        String loginId = pars.getString("loginId");
        UserMeta um = UserMeta.get();
        model = Datastore.query(um).filter(um.loginId.equal(loginId))
                .asSingle();
        init();
    }

    public UserRef() {
        log.info("begin UserRef");
        UserService userService = UserServiceFactory.getUserService();

        com.google.appengine.api.users.User usr = userService.getCurrentUser();
        String loginId = usr.getEmail();
        log.info("to get model");
        UserMeta um = UserMeta.get();

        log.info("to query");
        List<User> users = null;
        try {
            users = Datastore.query(um).filter(um.loginId.equal(loginId))
                    .asList();
        } catch (Exception e) {
            log.info(e.getLocalizedMessage());
        }
        log.info("users.size " + users.size());
        if (users.size() > 0) {
            model = users.get(0);
        }
        if (model == null) {
            // Userに追加する（ドメインユーザで登録済みであるので、問題ない）
            Transaction tx = Datastore.beginTransaction();
            // ユニックコード制御
            if (!Datastore.putUniqueValue(UserReg.UNIQUE_KEY, loginId)) {
                PageParameters pars = new PageParameters();
                pars.add("loginId", loginId);
                setResponsePage(UserReg.class, pars);
                return;
            }
            model = new User();
            model.setLoginId(loginId);
            Datastore.put(tx, model);
            tx.commit();
            PageParameters pars = new PageParameters();
            pars.add("loginId", model.getLoginId());
//            setResponsePage(UserReg.class, pars);
//            return;
        }
        log.info("to init model = " + model);
        init();
    }

    public void init() {
        form = new MainForm<User>(this, "wi_userRefForm") {
            private static final long serialVersionUID = 1L;

            @Override
            protected void onSubmitInner() {
                UserService userService = UserServiceFactory.getUserService();

                com.google.appengine.api.users.User usr = userService
                        .getCurrentUser();
                String loginId = usr.getEmail();
                if(loginId.equals(model.getLoginId())){
                    setResponsePage(UserSelfReg.class);
                }
                else{
                    PageParameters pars = new PageParameters();
                    pars.add("loginId", model.getLoginId());
                    setResponsePage(UserReg.class, pars);
                }
            }

        };
        log.info("to add label");
        form.add(new Label("wi_loginId", new PropertyModel<String>(this,
                "model.loginId")));
        log.info("to add firstname");
        form.add(new Label("wi_firstName", new PropertyModel<String>(this,
                "model.firstName")));
        log.info("to add lastName");
        form.add(new Label("wi_lastName", new PropertyModel<String>(this,
                "model.lastName")));
        log.info("to add seq");
        form.add(new Label("wi_seq", new PropertyModel<String>(this,
                "model.seq")));
        log.info("to get belongGroups");
        UserGroupMeta ugm = UserGroupMeta.get();
        // ユーザグループを取得する
        belongGroups.addAll(Datastore.query(ugm).filter(
                ugm.loginId.equal(model.getLoginId())).sort(ugm.seq.asc)
                .asList());
        GroupMeta gm = GroupMeta.get();
        for (UserGroup userGroup : belongGroups) {
            Group group = Datastore.query(gm).filter(
                    gm.code.equal(userGroup.getGroupCode())).asSingle();
            if (group != null) {
                userGroup.setGroupName(group.getName());
            } else {
                // 　ごみデータ
                belongGroups.remove(userGroup);
                Datastore.delete(userGroup.getId());
                return;
            }
        }
        lvBelongGroup = new ListView<UserGroup>("wi_trBelongGroup",
                belongGroups) {
            private static final long serialVersionUID = 1L;

            @Override
            protected void populateItem(ListItem<UserGroup> item) {
                UserGroup userGroup = (UserGroup) item.getModelObject();
                PageParameters pars = new PageParameters();
                log.info("code = " + userGroup.getGroupCode());
                pars.add("code", userGroup.getGroupCode());
                BookmarkablePageLink<GroupRef> link = new BookmarkablePageLink<GroupRef>(
                        "wi_tdGroupLink", GroupRef.class, pars);

                link.add(new Label("wi_tdBelongGroupName",
                        new PropertyModel<String>(userGroup, "groupName")));
                item.add(link);

                item.add(new Label("wi_tdRole", userGroup.getRole()));
                item.add(new Label("wi_tdMainGroup",
                        userGroup.getMain() ? getString("belong.mark") : ""));
            }
        };
        log.info("to add belongGroup");
        form.add(lvBelongGroup);
    }
}
